import unicodedata

from apps.task.re_pattern import RePattern


class CalendarOneParse(object):
    """
    关于《中国历史日历》的数据格式，数据的一行代表一天，这一行中有十三项：
    第一項：1－14位　　　　帝讳（如，“劉駿”）
    第二項：15－28位　　　朝代（如，“南朝宋”）
    第三項：29－42位　　　帝号（如，“孝武帝”）
    第四項：43－56位　　　年号（如，“孝建”）
    第五項：57－59位　　　中历年数（如，“01”。年数用二位数字表示，
    不足二位者用“０”补齐。）
    第六項：60－64位　　　年干支（如，“甲午”）
    第七項：65－68位　　　中历月数（如，“01”。月数用二位数字表示，
    不足二位者用“０”补齐；閏月，則在月數前加“+”表示。）
    第八項：69－73位　　　月干支（如，“丙寅”）
    第九項：74－76位　　　中历日数（如，“01”。日数用二位数字表示，
    不足二位者用“０”补齐。）
    第十項：77－80位　　　日干支（如，“己亥”）
    第十一項：81－86位　　公元年（如，“0454.”。公元年数用四
    位数字表示，不足四位者用“０”补齐;公元前用“-”表示）
    第十二項：87－89位　公元月（如，“02.”。月数用二位数字表
    示，不足二位者用“０”补齐。）
    第十三項：90-93位　公元日（如，“14.”。月数用二位数字表
    示，不足二位者用“０”补齐。）
    """
    def __init__(self):
        self.data_info_dict: dict = {}

    def run_parse(self, one_text):
        self.data_info_dict = {}

        def is_fullwidth(char):
            """
            全角
            :param char:
            :return:
            """
            return unicodedata.east_asian_width(char) in ('F', 'W', 'A')

        def is_halfwidth(char):
            """
            半角
            :param char:
            :return:
            """
            return unicodedata.east_asian_width(char) in ('Na', 'N', 'H')

        line = one_text
        a, b, c, d, e = line[:7], line[7:14], line[14:21], line[21:28], line[28:]
        num = 56
        data_dict = {}
        for char in e:
            if is_halfwidth(char):
                num = num + 1
                data_dict[num] = char
            else:
                num1 = num + 1
                num2 = num1 + 1
                num = num2
                data_dict[(num1, num2)] = char
        ranges = [(57, 59), (60, 64), (65, 68), (69, 73), (74, 76), (77, 80), (81, 92)] # 93 存在的话位 换行符 这里到92结束
        keys = list(data_dict.keys())
        lists_e_data = []
        for r in ranges:
            continue_value = []
            temp_str = ""
            for i in range(r[0], r[1] + 1):
                if i in continue_value:
                    continue
                if i in keys:
                    temp_str = temp_str + data_dict[i]
                elif (i, i + 1) in keys:
                    continue_value.append(i + 1)
                    temp_str = temp_str + data_dict[(i, i + 1)]
                else:
                    raise Exception("日历位置错误")
            lists_e_data.append(temp_str)
        if len(lists_e_data) != 7:
            raise Exception("日历数据长度错误")

        self.data_info_dict["date_emperor"] = a.strip()
        self.data_info_dict["date_dynasty"] = b.strip()
        self.data_info_dict["date_emperor_title"] = c.strip()
        self.data_info_dict["date_reign_title"] = d.strip()
        self.data_info_dict["date_year"] = lists_e_data[0].strip()
        self.data_info_dict["date_year_trunk_branch"] = lists_e_data[1].strip()
        self.data_info_dict["date_month"] = lists_e_data[2].strip()
        self.data_info_dict["date_month_trunk_branch"] = lists_e_data[3].strip()
        self.data_info_dict["date_day"] = lists_e_data[4].strip()
        self.data_info_dict["date_day_trunk_branch"] = lists_e_data[5].strip()
        self.data_info_dict["date_full"] = lists_e_data[6].strip().replace("\n", "")

        return self.data_info_dict
